package com.auntvt.timo.jpax.core.quick.chain;

import com.auntvt.timo.jpax.core.quick.AbstractJpaQuick;
import com.auntvt.timo.jpax.core.quick.interfaces.IChainQuick;
import com.auntvt.timo.jpax.core.service.ChainQuickService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Optional;

/**
 * spring data jpa ChainQuick操作抽象类，可通过ChainQuickService链式调用Quick查询功能接口
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public abstract class AbstractJpaChainQuick<T, Children, R> extends AbstractJpaQuick<T, Children, R> implements IChainQuick<T> {

    /**
     * Quick对象
     *
     * @return ChainQuickService 类型
     */
    protected abstract ChainQuickService<T> getService();

    /**
     * 根据Quick构建的条件获取实体类对象
     *
     * @return 实体类对象
     */
    @Override
    public T get() {
        return getService().get(this);
    }

    /**
     * 根据Quick构建的条件获取实体类对象
     *
     * @return Optional对象
     */
    @Override
    public Optional<T> getOptional() {
        return getService().getOptional(this);
    }

    /**
     * 根据Quick构建的条件获取数据
     *
     * @return 列表数据
     */
    @Override
    public List<T> lists() {
        return getService().lists(this);
    }

    /**
     * 根据Quick构建的条件获取数据，并且进行排序
     *
     * @param sort 排序对象
     * @return 列表数据
     */
    @Override
    public List<T> lists(Sort sort) {
        return getService().lists(this, sort);
    }

    /**
     * 根据Quick构建的条件获取数据，并且进行分页
     *
     * @param pageable 分页配置对象
     * @return 分页数据
     */
    @Override
    public Page<T> pages(Pageable pageable) {
        return getService().pages(this, pageable);
    }

    /**
     * 根据Quick构建的条件统计个数
     *
     * @return 数量
     */
    @Override
    public long count() {
        return getService().count(this);
    }

}
